package BioHuella;

import adirector.Record;
import adirector.saSpeedMatch;
import pkg1ifxArchivos.cIfxDatosTemplate;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.neurotechnology.NImages.NImage;
import com.neurotechnology.NImages.NImageFormat;
import com.neurotechnology.NMatcher.NMatcher;
import com.neurotechnology.Templates.NBiometricType;
import com.neurotechnology.Templates.NFRecord;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import pkg1ifxArchivos.caDatosTemplate;
import pkg1ifxArchivos.cifxConfig;
import pkg1ifxArchivos.cifxLogs;

public class RecordDB //Huella
{
    private Connection con;
    private List<Record> recordsList;
    Record fr;
    
    private final String url = "jdbc:sqlserver://";

    private  String serverName = "----";
    private  String portNumber = "----";
    private  String databaseName = "----";
    private  String userName = "----";
    private  String password = "----";
    private  String selectMethod = "cursor";
    //Strail 11ene2012
    private int ninicio=0;
    private int nfinal =-1;
    //Strail 30ene2012
    //PAra leer el archivo de configuracion
    private static cifxLogs olog = new cifxLogs("appbots.log");
    private static cifxConfig oconf = new cifxConfig("appbots.conf",olog);
    private boolean parametroscargados = false;
    public void cargaParametrosConf()
    {
        /*
         * SERVIDOR_BD=localhost
PUERTO_BD=1433
USUARIO_BD=sa
PASSWORD_BD=4dm1nSA2011
NOMBASEDADOS_BD=caja
         */
        try
        {
            if(!parametroscargados)
            {
                olog.outMensaje("(HUELLA) RecordDB.cargaParametrosConf(): INICIO CARGA DE PARAMETROS");
                serverName = oconf.traeParametro("SERVIDOR_BD");
                portNumber= (oconf.traeParametro("PUERTO_BD"));
                databaseName = oconf.traeParametro("NOMBASEDADOS_BD");
                password = oconf.traeParametro("PASSWORD_BD");
                userName = oconf.traeParametro("USUARIO_BD");
                parametroscargados=true;
                olog.outMensaje("(HUELLA) RecordDB.cargaParametrosConf(): FIN CARGA DE PARAMETROS");
            }
        }catch(Exception err)
        {
            olog.outMensaje("(HUELLA) RecordDB.cargaParametrosConf(): ERROR"+ err.getMessage());
        }
       // serverName =Integer.valueOf(oconf.traeParametro("PUERTO_LOCAL"));
    }
    public void setRango(int minicio, int mfinal)
    {
        ninicio=minicio;
        nfinal=mfinal;
    }

    private String getConnectionUrl()
    {
        //Strail 30ene2012
        cargaParametrosConf();
        //
        return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
    }
    //Strail 11ene2012
    public void actualizarArrayListHuella(caDatosTemplate odatostemplate)
    {
        try
        {
            for(int i=0; i < odatostemplate.getTemplate().length; i++)
            {


                    fr = new Record();
                    fr.setName(odatostemplate.getCedulas()[0]);
                    fr.setId(odatostemplate.getTemplate()[i].Id);
                    fr.setTempalte(odatostemplate.getTemplate()[i].getTemplate());


            }
            recordsList.add(fr);

        }
        catch (Exception ex) {
                 System.out.println("actualizarArrayListHuella(): ERROR : "+ ex.getMessage());

        }
    }


    //Strail 13feb2012
    public RecordDB(int minicio,int mfinal,saSpeedMatch smdato) 
    {
        try
        {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(getConnectionUrl(),userName,password);
            olog.outMensaje("(HUELLA)RecordDB(): CARGANDO BIOMETRIAS ... INICIANDO EN:"+minicio);
            ninicio=minicio;
            nfinal=mfinal;
            ResultSet rs = selectRango(ninicio, nfinal);
            //Strail 11ene2012 ResultSet rs = selectAll();
            int ncuantas=0;
            while (rs.next()) 
            {
               
                fr = new Record();
                fr.setId(rs.getInt("Id")); 
                fr.setName(rs.getString("TemplateId"));
                fr.setTempalte(rs.getBytes("Template"));
                smdato.agregaRecordTemplate(fr);
                //recordsList.add(fr);
                ncuantas++;
            }
            //olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
            olog.outMensaje("(HUELLA)RecordDB(): \nBIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
            olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS CARGADAS + INICIO ... TOTAL:"+(ncuantas+minicio));
            olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS ESPERADAS:"+(nfinal));
            
            
        }
        catch(SQLException se){
            
            olog.outMensaje("(HUELLA)RecordDB(): ERROR(0) SQLException : "+se.getMessage()); 
        }
        catch(Exception e)
        {
            olog.outMensaje("(HUELLA)RecordDB(): ERROR(0) : "+e.getMessage());
        }
        
    }
    public RecordDB(int minicio,int mfinal) throws Exception
    {
        try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(getConnectionUrl(),userName,password);
        }catch(SQLException e){
            System.out.println("RecordDBServidor, Constructor, driver u usuario o contraseña "+e.getMessage());
            olog.outMensaje("(HUELLA)RecordDB(): ERROR "+e.getMessage());
        }
        olog.outMensaje("(HUELLA)RecordDB(): CARGANDO BIOMETRIAS ... INICIANDO EN:"+minicio);
        recordsList = new ArrayList<Record>();
        ninicio=minicio;
        nfinal=mfinal;
        ResultSet rs = selectRango(ninicio, nfinal);
        //Strail 11ene2012 ResultSet rs = selectAll();
        int ncuantas=0;
        while (rs.next()) 
        {
            fr = new Record();
            fr.setId(rs.getInt("Id")); 
            fr.setName(rs.getString("TemplateId"));
            fr.setTempalte(rs.getBytes("Template"));
            recordsList.add(fr);
            ncuantas++;
        }
        //olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
        olog.outMensaje("(HUELLA)RecordDB(): \nBIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
        olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS CARGADAS + INICIO ... TOTAL:"+(ncuantas+minicio));
        olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS ESPERADAS:"+(nfinal));
    }

    public List<Record> getRecords()
    {
        return recordsList;
    }
    /***
     * Funcion que retorna un ResulSet con un rango de templates
     * @param ninicio Numero de inicio del ID de los template
     * @param nfinal Numero FInal de los ID, donde -1 indica sin limite final
     * @return
     */
    public ResultSet selectRango(int ninicio, int nfinal)
    {
        ResultSet rs = null;
        try
        {
            Statement select = con.createStatement();
            String cadenaselect="";
            if(nfinal==-1)
            {
                cadenaselect = "SELECT * FROM Finger_Templates WHERE Id >= "+ninicio;
            }
            else
            {
                cadenaselect = "SELECT * FROM Finger_Templates WHERE Id >= "+ninicio+" AND Id <="+nfinal;
            }
            rs = select.executeQuery(cadenaselect);
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            olog.outMensaje("(HUELLA)selectRango(): ERROR"+e.getMessage());
        }
        return rs;
    }

    public String selectTemplate(byte[] template,String cedula, NMatcher matcher)
    {
        ResultSet rs = null;
        String resultados ="-1|-1";
        try
        {
            Statement select = con.createStatement();
            String cadenaselect="";
            //cadenaselect = "SELECT * FROM Finger_Templates WHERE TemplateId='"+cedula+"'";
            cadenaselect = "SELECT * FROM Finger_Templates WHERE SUBSTRING(TemplateId,1,10)="+cedula+"";

            rs = select.executeQuery(cadenaselect);
            while(rs.next())
            {
                int score = matcher.verify(rs.getBytes("Template"), template);
                if(score !=0)
                {
                    resultados="1|"+cedula;
                    break;
                }
                else
                    resultados="3003|"+cedula;//Responde con 3003 si existe la cedula pero no coinciden los templates
            }

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            olog.outMensaje("(HUELLA)selectTemplate(): ERROR"+e.getMessage());
        }
        return resultados;
    }
    public ResultSet selectAll() 
    {
        ResultSet rs = null;
        try 
        {
            Statement select = con.createStatement();
            rs = select.executeQuery("SELECT * FROM Finger_Templates");
        } 
        catch (Exception e) 
        {
            System.out.println(e.getMessage());
        }
        return rs;
    }

    public void grabarHuella(int maxID){
        try{
            PreparedStatement pstmt = con.prepareStatement("SELECT * FROM Finger_Templates where Id = "+maxID);
            ResultSet rs = pstmt.executeQuery();
            rs.next();
            fr = new Record();
            fr.setId(rs.getInt("Id")); 
            fr.setName(rs.getString("TemplateId"));
            fr.setTempalte(rs.getBytes("Template"));
            recordsList.add(fr);
            System.out.println("adiciono el template: "+maxID);
        }catch(SQLException ex){
            System.out.println("error insertando Fenix_Server huella "+ex);
        }
    }
    
    public byte[] IdentHuella(String maxID){
            byte[] temp = null;
            try{
                PreparedStatement pstmt = con.prepareStatement("SELECT * FROM finger_temporal where Id = "+maxID);
                ResultSet rs = pstmt.executeQuery();
                rs.next();
                temp = rs.getBytes("Template");
                System.out.println("leyo el template: "+maxID);
                return temp;
            }catch(SQLException ex){
                System.out.println("error insertando Fenix_Server huella "+ex);
                return temp;
            }
        }
    
    // Guardar el template de una huella en la BD en el Servidor
    public void almacenar_Huella (cIfxDatosTemplate ofi) throws Exception
    {
        PreparedStatement pstmt;
        ResultSet rs;
        try
        {
            //Connection con = ServConexion();
            pstmt = con.prepareStatement("Select MAX(Id) as maximo from Finger_Templates");
            rs= pstmt.executeQuery();
            rs.next();
            int maxID = rs.getInt(1)+ 1;
            byte[] pngimage = null;
            pstmt = con.prepareStatement("INSERT INTO Finger_Templates VALUES (?,?,?,?)");
            pstmt.setInt(1, maxID);
            if (ofi.T_Template_Id != null)
            pstmt.setString(2, ofi.T_Template_Id);
            if (ofi.T_Template != null)
            pstmt.setBytes(3, ofi.T_Template); //setbytes(3,ofi.template);
            if (pngimage == null)
            pstmt.setBytes(4, null);
            pstmt.execute();
            rs.close();
            con.close();
        }
        catch (SQLException ex) {

        }
        
    }

    public synchronized void deleteDB() 
    {
        try 
        {
            Statement delete = con.createStatement();
            delete.executeQuery("DELETE FROM Finger_Templates");
            recordsList = new ArrayList<Record>();
        } 
        catch (Exception e) 
        {
            System.out.println(e.getMessage());
        }
    }
}
